#ifndef boost_numeric_bindings_type_hpp
#define boost_numeric_bindings_type_hpp

// This header provides typedefs to float complex and double complex.
// This makes it possible to redefine the complex class being used.

#include <complex>

namespace boost
{
    namespace numeric
    {
        namespace bindings
        {
            namespace traits
            {
                /* The types for single and double precision complex numbers.
                 * You can use your own types if you define
                 * BOOST_NUMERIC_BINDINGS_USE_CUSTOM_COMPLEX_TYPE.
                 * Note that these types must have the same memory layout as the
                 * corresponding FORTRAN types.
                 * For that reason you can even use a different type in each translation
                 * unit and the resulting binary will still work!
                 */
#ifndef BOOST_NUMERIC_BINDINGS_USE_CUSTOM_COMPLEX_TYPE
                typedef std::complex<float> complex_f;
                typedef std::complex<double> complex_d;
#endif

                template <typename T>
                T real(std::complex<T> const& c) { return std::real(c); }

                template <typename T>
                T imag(std::complex<T> const& c) { return std::imag(c); }


                struct null_t
                {
                };
            }
        }
    }
}

#endif // boost_numeric_bindings_type_hpp
